package ahp.client;

public class Kategoria {

	public double macierz[][];
	public double macierz_unormowana[][];
	public double wektor_preferencji[];
	public double suma[]; // suma kolumn
	public double indeks_losowy;
	public double wyznacznik;
	public String nazwa;

	Kategoria(String _nazwa, double _macierz[][]) {
		nazwa = _nazwa;
		macierz = _macierz;
		inicjujMacierz(macierz);

		macierz_unormowana = new double[macierz.length][macierz.length];
		wektor_preferencji = new double[macierz.length];
		suma = new double[macierz.length];
		wyznacznik = -1;
		wyznacz_indeks();
	}

	void wyznacz_indeks() {
		int size = macierz.length;

		switch (size) {
		case 2:
			indeks_losowy = 1;
			break;
		case 3:
			indeks_losowy = 0.52;
			break;
		case 4:
			indeks_losowy = 0.89;
			break;
		case 5:
			indeks_losowy = 1.11;
			break;
		case 6:
			indeks_losowy = 1.25;
			break;
		case 7:
			indeks_losowy = 1.35;
			break;
		default:
			indeks_losowy = 1.4;
		}

	}

	void licz_sume_kolumn() {
		for (int i = 0; i < macierz.length; i++) {
			for (int j = 0; j < macierz[i].length; j++) {
				suma[j] += macierz[i][j];
			}
		}

	}

	void licz_macierz_unormowana() {

		for (int i = 0; i < macierz.length; i++) {
			for (int j = 0; j < macierz[i].length; j++) {
				macierz_unormowana[i][j] = macierz[i][j] / suma[j];
			}
		}

	}

	void licz_wektor() {

		for (int i = 0; i < macierz_unormowana.length; i++) {
			for (int j = 0; j < macierz_unormowana[i].length; j++) {
				wektor_preferencji[i] += macierz_unormowana[i][j];
			}
			wektor_preferencji[i] = (wektor_preferencji[i])
					/ (macierz_unormowana[i].length);
		}

	}

	void licz_spojnosc() {
		licz_sume_kolumn();
		licz_macierz_unormowana();
		licz_wektor();

		// liczenie lambda
		wyznacznik = 0;
		for (int i = 0; i < wektor_preferencji.length; i++) {
			wyznacznik += (wektor_preferencji[i] * suma[i]);
		}

		//System.out.println("lambda " + wyznacznik);
		wyznacznik = (wyznacznik - macierz.length) / (macierz.length - 1);
		//System.out.println("CI " + wyznacznik);

		wyznacznik = wyznacznik / indeks_losowy;
		//System.out.println("indeks " + indeks_losowy);
		System.out.println("Wskaźnik spójności: " + wyznacznik);

		//pokaz();

	}

	void pokaz() {
//		System.out.println("suma kolumn");
//		for (int i = 0; i < suma.length; i++) {
//			System.out.print(suma[i] + " ");
//		}
		if(wyznacznik > 0.1){
			System.err.println("Macierz " + nazwa + " jest niesp�jna");
		}
//		System.out.println(" \n Macierz unormowana:");
//		for (int i = 0; i < macierz_unormowana.length; i++) {
//			for (int j = 0; j < macierz_unormowana[i].length; j++) {
//				System.out.print(macierz_unormowana[i][j] + "\t");
//			}
//			System.out.println("");
//
//		}
		
		System.out.println(" \nMacierz preferencji: ");
		for (int i = 0; i < macierz.length; i++) {
			for (int j = 0; j < macierz[i].length; j++) {
				System.out.println(macierz[i][j]);
			}
			System.out.println("");

		}

		System.out.println(" \nWektor preferencji:");
		for (int i = 0; i < wektor_preferencji.length; i++) {
			System.out.println(wektor_preferencji[i]);
		}
		System.out.println("\n");
	}

	// wype�nia macierz jedynkami 
	private void inicjujMacierz(double[][] macierz) {
		for (int i = 0; i < macierz.length; i++) {
			//for (int j = 0; j < macierz.length; j++){
				
				macierz[i][i] = 1;
			//}
		}
	}

}
